<?php
/**
 * 유틸리티 - utilCalendar
 *
 * <code>
 * $utilCalendar = utilCalendar::getInstance();
 *
 * $utilCalendar->CalendarByGrid($iMonth, $iYear);
 * </code>
 *
 * @package util
 *
 * @author jylee3@simplexi.com
 * @version 1.0
 */
class utilCalendar
{
    /**
     * utilCalendar Instance
     *
     * @return    utilCalendar
     */
    public static function getInstance()
    {
        return utilSplClass::load('utilCalendar');
    }

    public function __construct() {}

    /**
     * 지정년 연월의 Calendar 테이블을 반환합니다.
     *
     * <code>
     * $utilCalendar = utilCalendar::getInstance();
     * // 3차원 배열
     * $aCalendarGrid = $utilCalendar->CalendarByGrid();
     *
     * $aCalendarGrid[0][0] = array
     * (
     *     ["IS_BLANK"]=>    // 빈 구간 여부(해당 달의 날짜가 존재할 경우 false, 아니면 true)
     *     bool(true)
     *     ["IS_TODAY"]=>    // 해당일 여부
     *  bool(false)
     *  ["DAY"]=>    // 해당 날짜
     *  int(0)
     *  ["WEEK"]=>    // 주간 값(0~6)
     *  int(3)
     *  ["WEEK_STR"]=>    // 주간 문자열(3글자)
     *  string(3) "Thu"
     *  ["WEEK_STR_FULL"]=> // 주간 문자열(전체)
     *  string(0) ""
     *  ["YEAR_DAY"]=>    // 해당 연의 일수(0~356)
     *  int(0)
     *  ["TIME"]=>    // 해당 일의 TimeStamp
     *  int(0)
     * );
     * </code>
     *
     * @param Integer $iMonth
     * @param Integer $iYear
     *
     * @return Array
     */
    public function CalendarByGrid($iMonth=null, $iYear=null)
    {
        if (is_null($iYear))    $iYear = date('Y');
        if (is_null($iMonth))   $iMonth = date('m');

        /**
         * 해당 월 시작일
         */
        $iMonthByTime = mktime(0, 0, 0, $iMonth, 1, $iYear);
        $iCurrentDayByTime = mktime(0, 0, 0, date('m'), date('d'), date('Y'));

        /**
         * 해당 월 시작일의 요일(숫자, 일요일에서 토요일까지(0~6))
         */
        $iMonthByStartWeek = date('w', $iMonthByTime);

        /**
         * 해당 월의 일 수
         */
        $iMonthByDays = date('t', $iMonthByTime);

        $iGridX = 7;
        $iGridY = (int)ceil(($iMonthByStartWeek + $iMonthByDays)/$iGridX);

        $aGrid = array();

        $iDay = 0;

        for ($y=0; $y<$iGridY; $y++) {
            $aGridX = array();
            for ($x=0; $x<$iGridX; $x++) {
                if ($iMonthByStartWeek>0 || $iDay>=$iMonthByDays) {
                    if ($iMonthByStartWeek>0) {
                        $iMonthByStartWeek--;

                        $iTime = $iMonthByTime - (86400*($iMonthByStartWeek+1));
                    } else {
                        $iDay++;

                        $iTime = $iMonthByTime + (86400*($iDay-1));
                    }

                    $aGridX[$x] = array
                    (
                        'IS_BLANK'=>true,
                        'IS_TODAY'=>false,
                        'DAY'=>date('d', $iTime),
                        'WEEK'=>date('w', $iTime),
                        'WEEK_STR'=>date('D', $iTime),
                        'WEEK_STR_FULL'=>date('l', $iTime),
                        'YEAR_DAY'=>date('z', $iTime),
                        'TIME'=>$iTime
                    );
                } else {
                    $iDay++;

                    $iTime = $iMonthByTime + (86400*($iDay-1));

                    $aGridX[$x] = array
                    (
                        'IS_BLANK'=>false,
                        'IS_TODAY'=>($iCurrentDayByTime==$iTime)? true : false,
                        'DAY'=>$iDay,
                        'WEEK'=>$x,
                        'WEEK_STR'=>date('D', $iTime),
                        'WEEK_STR_FULL'=>date('l', $iTime),
                        'YEAR_DAY'=>date('z', $iTime),
                        'TIME'=>$iTime
                    );
                }
            }
            $aGrid[$y] = $aGridX;
        }

        return $aGrid;
    }
}
